package com.sz.jinzheng.until;


import com.sz.jinzheng.service.UserService;
import com.sz.jinzheng.model.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Description: JwtUntil
 * @author: Sheep
 * @date: 2021年07月07日 14:57
 */
@Slf4j
@Component
public class JwtUntil {
    @Autowired
    private UserService userService;
    /**
     * 设置token过期时间为1个小时
     */
    private final static String ID = "yang";
    private final static long TTL = 3600000;

    /**
     * @param user  传这个用户主要是为了手机号(手机号不能重复)
     * @param roles 这个是role集合tojson后的结果
     * @return
     */
    public String createToken(User user, String roles) {
        //获取当前时间
        long t = System.currentTimeMillis();
        //转换一下当前时间格式
        Date date = new Date(t);
        //过期时间
        Date exp = new Date(t + TTL);
        JwtBuilder token = Jwts.builder().setId(ID).setIssuedAt(date).setExpiration(exp).setSubject(user.getPhone())
                .signWith(SignatureAlgorithm.HS256, ID).claim("roles", roles);
        log.info("token创建成功=" + token.compact());
        return token.compact();
    }

    /**
     * 解析token
     *
     * @param token
     * @return
     */
    public Claims parseToken(String token) {
        Claims claims = Jwts.parser().setSigningKey(ID).parseClaimsJws(token).getBody();
        log.debug("id = " + claims.getId());
        log.debug("getSubject = " + claims.getSubject());
        return claims;
    }


    /**
     * 获取uid
     *
     * @param token
     * @return
     */
    public Integer getUid(String token) {
        Claims claims = parseToken(token);
        if (claims != null) {
            //1.获取到手机号
            String phone = claims.getSubject();
            //2.通过手机号查询uid
            return userService.getUserByPhone(phone).getUid();
        }
        return null;
    }
}
